home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 9 / The PC-SIG Library on CD ROM - Ninth Edition.iso / 501_600 / DISK0579 / DISK0579.ZIP / CHAP12.TXT < prev    next >
Text File  |  1989-12-01  |  28KB  |  650 lines

  1.  
  2.  
  3.  
  4.                                                    Chapter 12
  5.                               POINTERS AND DYNAMIC ALLOCATION
  6.  
  7.  
  8. THIS IS ADVANCED MATERIAL
  9. ____________________________________________________________
  10.  
  11. For certain types of programs, pointers and dynamic allocation
  12. can be a tremendous advantage, but many programs do not need
  13. such a high degree of data structure.  For that reason, it
  14. would probably be to your advantage to lightly skim over these
  15. topics and come back to them later when you have a substantial
  16. base of Pascal programming experience.  It would be good to
  17. at least skim over this material rather than completely
  18. neglecting it, so you will have an idea of how pointers and
  19. dynamic allocation work and that they are available for your
  20. use when needed.
  21.  
  22. A complete understanding of this material will require deep
  23. concentration as it is complex and not at all intuitive. 
  24. Nevertheless, if you pay close attention, you will have a good
  25. grasp of pointers and dynamic allocation in a short time.
  26.  
  27.  
  28. WHAT ARE POINTERS, AND WHAT GOOD ARE THEY?
  29. ____________________________________________________________
  30.  
  31. Examine the program named POINT.PAS for     =================
  32. your first example of a program using           POINT.PAS
  33. pointers.  In the var declaration you will  =================
  34. see two variables named Where and Who that
  35. have the symbol ^ in front of their types. 
  36. This defines them, not as variables, but as pointers to
  37. integer type variables and since they are pointers, they store
  38. an address.  Figure 12-1 is a graphical representation of the
  39. data space prior to beginning execution of the program.  A box
  40. represents a variable, and a box with a dot in it represents
  41. a pointer.  In line 12 of the program, the variable Index is
  42. assigned the value of 17 for purposes of illustration.  The
  43. pointer named Where is then assigned the address of the
  44. variable Index which means that it does not contain the value
  45. of 17, it contains the address of the storage location where
  46. the variable Index is stored.  In like manner, we assign the
  47. address of Index to the pointer named Who.  It should be
  48. obvious to you that Addr is a TURBO Pascal function that
  49. returns the address of its argument.
  50.  
  51.  
  52. HOW DO WE USE THE POINTERS?
  53. ____________________________________________________________
  54.  
  55. It should be clear to you that we now have a single variable
  56. named Index with two pointers pointing at it as depicted in
  57. figure 12-2.  If the pointers are useful, we should be able
  58.  
  59.                                                     Page 12-1
  60.  
  61.                               Pointers and Dynamic Allocation
  62.  
  63. to do something with them now, so we simply print out the same
  64. variable three different ways in line 15.  When we write
  65. "Where^", we are telling the system that we are not interested
  66. in the pointer itself but instead we are interested in the
  67. data to which the pointer points.  This is referred to as
  68. dereferencing the pointer.  Careful study of the output fields
  69. in line 15 will reveal that we first display the value of
  70. Index, then the value to which the pointer Where points, and
  71. finally the value to which the pointer Who points.  Since both
  72. pointers point to the variable Index, we are essentially
  73. displaying the value of Index three times.  You will confirm
  74. this when you compile and run this program.
  75.  
  76. In line 17, we tell the system to assign the value of 23 to
  77. the variable to which the pointer Where points as an
  78. illustration and figure 12-3 pictures the data space at this
  79. time.  If you understood the discussion in the previous
  80. paragraph, you will understand that we are actually assigning
  81. the variable named Index the value of 23 because that is where
  82. the pointer named Where is pointing.  In line 18, we once
  83. again display the value of the variable Index 3 times just as
  84. we did in line 15.  It would be to your advantage to compile
  85. and run this program to see that the value of 17 is output
  86. three times, then the value of 23 is output three times.
  87.  
  88. In a program as simple as this, the value of pointers is not
  89. at all clear but a simple program is required in order to make
  90. the technique clear.  Display the program named POINT.PAS on
  91. your monitor again because we are not yet finished with it.
  92.  
  93.  
  94. A FEW MORE POINTERS
  95. ____________________________________________________________
  96.  
  97. In line 4, we define a new type named Int_Point which is a
  98. pointer type to an integer variable.  We use this new type in
  99. line 9 to define three more pointers and in line 20, we assign
  100. one of them the address of the variable named Index.  Since
  101. the pointers are of identical types, in line 21 we can assign
  102. Pt2 the value of Pt1, which is actually the address of the
  103. variable named Index.  Likewise, the pointer Pt3 is assigned
  104. the value of Pt2, and we have all three pointers pointing to
  105. the variable named Index.  If you are using TURBO Pascal
  106. version 4.0 or 5.x, you are allowed to assign pointers like
  107. this only if they have the same type, which these three do. 
  108. However, since the pointers named Where and Who are declared
  109. individually, they are not of the same type according to the
  110. rules of Pascal and if line 14 were changed to read "Who :=
  111. Where;", a compilation error would occur with TURBO Pascal
  112. version 4.0 or 5.x.  This error would not occur with TURBO
  113. Pascal 3.0 since it is a little less stringent in its type
  114. checking.  The variables are only assignment compatible if
  115. they are declared with the same type name.
  116.  
  117.  
  118.                                                     Page 12-2
  119.  
  120.                               Pointers and Dynamic Allocation
  121.  
  122. Finally, we assign the only variable in this program which is
  123. named Index the value of 151 in line 23 and display the value
  124. 151 three times as we did above.  Compile and run this program
  125. again to see that it does indeed display the value 151 three
  126. times.
  127.  
  128.  
  129. THIS IS FOR TURBO PASCAL VERSION 4.0 OR 5.X
  130. ____________________________________________________________
  131.  
  132. If you are using TURBO Pascal version 4.0    ================
  133. or 5.x, you should display the program          POINT4.PAS
  134. named POINT4.PAS on your monitor for an      ================
  135. example of another new extension to the
  136. Pascal programming language by Borland. 
  137. This program is identical to the last except in lines 13, 14
  138. and 20, where the symbol @ is used to denote the address of
  139. the variable Index rather than the function Addr.  This is
  140. only available with TURBO Pascal version 4.0 or 5.x as a
  141. convenience to you.  In ANSI standard Pascal the @ symbol is
  142. used as a synonym for the ^ symbol but Borland chose to use
  143. it for a completely different purpose.  If you are using TURBO
  144. Pascal 3.0, you will not be able to compile and run this
  145. program, but nothing is lost because it is identical to the
  146. previous one.
  147.  
  148.  
  149. OUR FIRST LOOK AT DYNAMIC ALLOCATION
  150. ____________________________________________________________
  151.  
  152. If you examine the file named                ================
  153. POINTERS.PAS, you will see a very trivial      POINTERS.PAS
  154. example of pointers and how they are used    ================
  155. with dynamically allocated variables.  In
  156. the var declaration, you will see that the
  157. two variables have a ^ in front of their respective types once
  158. again, defining two pointers.  They will be used to point to
  159. dynamically allocated variables that have not yet been
  160. defined.
  161.  
  162. The pointer My_Name is a pointer to a 20 character string. 
  163. The pointer actually points to an address somewhere within the
  164. computer memory, but we don't know where yet.  Actually, there
  165. is nothing for it to point at because we have not defined a
  166. variable.  After we assign it something to point to, we can
  167. use the pointer to access the data stored at that address.
  168.  
  169. Your computer has some amount of memory installed in it. If
  170. it is an IBM-PC or compatible, it can have up to 640K of RAM
  171. which is addressable by various programs.  The operating
  172. system requires about 60K of the total, and the TURBO Pascal
  173. run time system requires about 4K to 8K depending on which
  174. version you are using, and what functions you have called. 
  175. The TURBO Pascal program can use up to 64K.  Adding those
  176.  
  177.                                                     Page 12-3
  178.  
  179.                               Pointers and Dynamic Allocation
  180.  
  181. three numbers together results in about 128K or 132K.  Any
  182. memory you have installed in excess of that is available for
  183. the stack and the heap.  The stack is a standard area defined
  184. and controlled by DOS that can grow and shrink as needed. 
  185. Many books are available to define the stack and its use if
  186. you are interested in more information on it.
  187.  
  188.  
  189. WHAT IS THE HEAP?
  190. ____________________________________________________________
  191.  
  192. The heap is a Pascal defined entity that utilizes otherwise
  193. unused memory to store data.  It begins immediately following
  194. the program and grows as necessary upward toward the stack
  195. which is growing downward.  As long as they never meet, there
  196. is no problem.  If they meet, a run-time error is generated. 
  197. The heap is therefore outside of the 64K limitation of TURBO
  198. Pascal and many other Pascal compilers.
  199.  
  200. TURBO Pascal version 4.0 or 5.x does not limit us to 64K, but
  201. there are other reasons for using the heap in addition to the
  202. 64K limitation.  These should be evident as we learn how the
  203. heap works.
  204.  
  205. If you did not understand the last few paragraphs, don't
  206. worry.  Simply remember that dynamically allocated variables
  207. are stored on the heap and do not count in the 64K limitation
  208. placed upon you by some compilers.
  209.  
  210. Back to our example program, POINTERS.PAS.  When we actually
  211. begin executing the program, we still have not defined the
  212. variables we wish to use to store data in.  The first
  213. executable statement in line 10 generates a variable for us
  214. with no name and stores it on the heap.  Since it has no name,
  215. we cannot do anything with it, except for the fact that we do
  216. have a pointer My_Name that is pointing to it.  By using the
  217. pointer, we can store up to 20 characters in it, because that
  218. is its type, and later go back and retrieve it.
  219.  
  220.  
  221. WHAT IS DYNAMIC ALLOCATION?
  222. ____________________________________________________________
  223.  
  224. The variable we have just described is a dynamically allocated
  225. variable because it was not defined in a var declaration, but
  226. with a New procedure.  The New procedure creates a variable
  227. of the type defined by the pointer, puts it on the heap, and
  228. finally assigns the address of the variable to the pointer
  229. itself.  Thus My_Name contains the address of the variable
  230. generated.  The variable itself is referenced by using the
  231. pointer to it followed by a ^, just like in the last program,
  232. and is read, "the variable to which the pointer points".
  233.  
  234.  
  235.  
  236.                                                     Page 12-4
  237.  
  238.                               Pointers and Dynamic Allocation
  239.  
  240. The statement in line 11 assigns a place on the heap to an
  241. integer type variable and puts its address in My_Age. 
  242. Following the New statements we have two assignment statements
  243. in which the two variables pointed at are assigned values
  244. compatible with their respective types, and they are both
  245. written out to the video display in much the same manner as
  246. we did in the program named POINT.PAS.  This is illustrated
  247. in figure 12-5.
  248.  
  249. Following execution of lines 13 and 14, the data space is
  250. configured as illustrated in figure 12-6.
  251.  
  252.  
  253. GETTING RID OF DYNAMICALLY ALLOCATED DATA
  254. ____________________________________________________________
  255.  
  256. The two statements in lines 19 and 20 are illustrations of the
  257. way the dynamically allocated variables are removed from use. 
  258. When they are no longer needed, they are disposed of with the
  259. Dispose procedure which frees up their space on the heap so
  260. it can be reused.
  261.  
  262. In such a simple program, pointers cannot be appreciated, but
  263. it is necessary for a simple illustration.  In a large, very
  264. active program, it is possible to define many variables,
  265. dispose of some of them, define more, and dispose of more,
  266. etc.  Each time some variables are disposed of, their space
  267. is then made available for additional variables defined with
  268. the New procedure.
  269. The heap can be made up of any assortment of variables, they
  270. do not have to all be the same.  One point must be kept in
  271. mind.  Anytime a variable is defined, it will have a pointer
  272. pointing to it.  The pointer is the only means by which the
  273. variable can be accessed.  If the pointer to the variable is
  274. lost or changed, the data itself is lost for all practical
  275. purposes.  Compile and run this program and examine the
  276. output.
  277.  
  278.  
  279. DYNAMICALLY STORING RECORDS;
  280. ____________________________________________________________
  281.  
  282. The next example program, DYNREC.PAS, is a   ================
  283. repeat of one we studied in an earlier          DYNREC.PAS
  284. chapter.  For your own edification, review   ================
  285. the example program BIGREC.PAS before
  286. going ahead in this chapter.  Assuming
  287. that you are back in DYNREC.PAS, you will notice that this
  288. program looks very similar to the earlier one, and in fact
  289. they do exactly the same thing.  The only difference in the
  290. type declaration is the addition of a pointer Person_Id, and
  291. in the var declaration, the first four variables are defined
  292. as pointers here, and were defined as record variables in the
  293. last program.
  294.  
  295.                                                     Page 12-5
  296.  
  297.                               Pointers and Dynamic Allocation
  298.  
  299.  
  300. A point should be made here.  Pointers are not generally used
  301. in very small programs.  This program is a good bit larger
  302. than the last and should be a clue to you as to why such a
  303. trivial program was used to introduce pointers in this
  304. tutorial.  A very small, concise program can illustrate a
  305. topic much better that an large complex program, but we must
  306. go on to more useful constructs of any new topic.
  307.  
  308.  
  309. WE JUST BROKE THE GREAT RULE OF PASCAL
  310. ____________________________________________________________
  311.  
  312. Notice in the type declaration that we used the identifier
  313. Person in line 18 before we defined it in line 19, which is
  314. illegal to do in Pascal.  Foreseeing the need to define a
  315. pointer prior to the record, the designers of Pascal allow us
  316. to break the rule in this one place.  The pointer could have
  317. been defined after the record in this particular case, but it
  318. was more convenient to put it before, and in the next example
  319. program, it will be required to put it before the record.  We
  320. will get there soon.
  321. Since Friend is really 50 pointers, we have now defined 53
  322. different pointers to records, but so far have defined no
  323. variables other than Temp and Index.  We immediately use the
  324. New procedure to dynamically allocate a record with Self
  325. pointing to it, and use the pointer so defined to fill the
  326. dynamically allocated record.  Compare this to the program
  327. named  BIGREC and you will see that it is identical except for
  328. the addition of the New and adding the ^ to each use of the
  329. pointer to designate the data pointed to.
  330.  
  331.  
  332. THIS IS A TRICK, BE CAREFUL
  333. ____________________________________________________________
  334.  
  335. Now go down to line 48 where Mother is allocated a record and
  336. is then pointing to the record.  It seems an easy thing to do
  337. then to simply assign all of the values of self to all the
  338. values of mother as shown in the next statement, but it
  339. doesn't work.  All the statement does, is make the pointer
  340. Mother point to the same place where Self is pointing because
  341. we did a pointer assignment.  The data that was allocated to
  342. the pointer Mother is now somewhere on the heap, but we don't
  343. know where, and we cannot find it, use it, or deallocate it. 
  344. This is an example of losing data on the heap.  The proper way
  345. is given in the next two statements where all fields of Father
  346. are defined by all fields of Mother which is pointing at the
  347. original Self record.  Note that since Mother and Self are
  348. both pointing at the same record, changing the data with
  349. either pointer results in the data appearing to be changed in
  350. both because there is, in fact, only one field where the data
  351. is stored.
  352.  
  353.  
  354.                                                     Page 12-6
  355.  
  356.                               Pointers and Dynamic Allocation
  357.  
  358. In order to Write from or Read into a dynamically assigned
  359. record it is necessary to use a temporary record since
  360. dynamically assigned records are not allowed to be used in I/O
  361. statements.  This is illustrated in lines 57 through 63 of the
  362. program where some data is written to the monitor.
  363.  
  364. Finally, the dynamically allocated variables are disposed of
  365. prior to ending the program.  For a simple program such as
  366. this, it is not necessary to dispose of them because all
  367. dynamic variables are disposed of automatically when the
  368. program is terminated and we return to DOS or the TURBO Pascal
  369. integrated environment.  Notice that if the "Dispose(Mother);"
  370. statement was included in the program, the data could not be
  371. found due to the lost pointer, and the program would be
  372. unpredictable, probably leading to a system crash.
  373.  
  374. It would be a meaningful exercise for you to diagram the data
  375. space for this program, at a few selected points in its
  376. execution, in a manner similar to that done in figure 12-1 to
  377. figure 12-5 of this chapter.
  378.  
  379.  
  380. SO WHAT GOOD IS THIS ANYWAY?
  381. ____________________________________________________________
  382.  
  383. Remember when you were initially studying BIGREC.PAS?  I
  384. suggested that you see how big you could make the constant
  385. Number_Of_Friends before you ran out of memory.  At that time
  386. we found that it could be made slightly greater than 1000
  387. before we got the memory overflow message at compilation.  Try
  388. the same thing with DYNREC.PAS to see how many records it can
  389. handle, remembering that the records are created dynamically,
  390. so you will have to run the program to actually run out of
  391. memory.  The final result will depend on how much memory you
  392. have installed, and how many memory resident programs you are
  393. using such as "Sidekick".  If you have a full memory of 640K,
  394. I would suggest you start somewhere above 8000 records of
  395. Friend.
  396.  
  397. Now you should have a good idea of why Dynamic Allocation can
  398. be used to greatly increase the usefulness of your programs. 
  399. There is, however, one more important topic we must cover on
  400. dynamic allocation.  That is the linked list.
  401.  
  402.  
  403. WHAT IS A LINKED LIST?
  404. ____________________________________________________________
  405.  
  406. Understanding and using a linked list is     ================
  407. by far the most baffling topic you will        LINKLIST.PAS
  408. confront in Pascal.  Many people simply      ================
  409. throw up their hands and never try to use
  410. a linked list.  I will try to help you
  411. understand it by use of an example and lots of explanation. 
  412.  
  413.                                                     Page 12-7
  414.  
  415.                               Pointers and Dynamic Allocation
  416.  
  417. Examine the program named LINKLIST.PAS for an example of a
  418. linked list.  I tried to keep it short so you could see the
  419. entire operation and yet do something meaningful.
  420.  
  421. To begin with, notice that there are two types defined in
  422. lines 4 and 6, a pointer to the record and the record itself. 
  423. The record, however, has one thing about it that is new to us,
  424. the last entry, Next is a pointer to another record of this
  425. type.  This record then, has the ability to point to itself,
  426. which would be trivial and meaningless, or to another record
  427. of the same type which would be extremely useful in some
  428. cases.  In fact, this is the way a linked list is used.  I
  429. must point out, that the pointer to another record, in this
  430. case called Next, does not have to be last in the list, it can
  431. be anywhere it is convenient for you.
  432.  
  433. A couple of pages ago, we discussed the fact that we had to
  434. break the great rule of Pascal and use an identifier before
  435. it was defined.  This is the reason the exception to the rule
  436. was allowed.  Since the pointer points to the record, and the
  437. record contains a reference to the pointer, one has to be
  438. defined after being used, and by rules of Pascal, the pointer
  439. can be defined first, provided that the record is defined
  440. immediately following it.  That is a mouthful but if you just
  441. use the syntax shown in the example, you will not get into
  442. trouble with it.
  443.  
  444.  
  445. STILL NO VARIABLES?
  446. ____________________________________________________________
  447.  
  448. It may seem strange, but we still will have no variables
  449. defined, except for our old friend Index.  In fact for this
  450. example, we will only define 3 pointers.  In the last example
  451. we defined 54 pointers, and had lots of storage room.  Before
  452. we are finished, we will have at least a dozen pointers but
  453. they will be stored in our records, so they too will be
  454. dynamically allocated.
  455.  
  456. Lets look at the program itself now.  In line 20, we create
  457. a dynamically allocated record and define it by the pointer
  458. Place_In_List.  It is composed of the three data fields, and
  459. another pointer.  We define Start_Of_List to point to the
  460. first record created, and we will leave it unchanged
  461. throughout the program.  The pointer Start_Of_List will always
  462. point to the first record in the linked list which we are
  463. building up.  The data space is as depicted in figure 12-7.
  464.  
  465.  
  466. WHAT IS "nil" AND WHAT IS IT USED FOR?
  467. ____________________________________________________________
  468.  
  469. We define the three variables in the record to be any name we
  470. desire for illustrative purposes, and set the pointer in the
  471.  
  472.                                                     Page 12-8
  473.  
  474.                               Pointers and Dynamic Allocation
  475.  
  476. record to nil.  The word nil is another reserved word that
  477. doesn't give the pointer an address but defines it as empty. 
  478. A pointer that is currently nil cannot be used to manipulate
  479. data because it has no value, but it can be tested in a
  480. logical statement to see if it is nil.  It is therefore a
  481. dummy assignment.  With all of that, the first record is
  482. completely defined.
  483.  
  484.  
  485. DEFINING THE SECOND RECORD
  486. ____________________________________________________________
  487.  
  488. When you were young you may have played a searching game in
  489. which you were given a clue telling you where to find the next
  490. clue.  The next clue had a clue to the location of the third
  491. clue.  You kept going from clue to clue until you found the
  492. prize.  You simply exercised a linked list.  We will now build
  493. up the same kind of a list in which each record will tell us
  494. where the next record is at.
  495.  
  496. In lines 27 through 33 we will define the second record.  Our
  497. goal will be to store a pointer to the second record in the
  498. pointer field of the first record.  In order to keep track of
  499. the last record, the one in which we need to update the
  500. pointer, we will keep a pointer to it in Temp_Place.  Now we
  501. can dynamically allocate another New record and use
  502. Place_In_List to point to it.  Since Temp_Place is now
  503. pointing at the first record, we can use it to store the value
  504. of the pointer which points to the new record which we do in
  505. line 29.  The 3 data fields of the new record are assigned
  506. nonsense data for our illustration, and the pointer field of
  507. the new record is assigned nil.  We have reached the point
  508. when the data space is as depicted in figure 12-8.
  509.  
  510. Let's review our progress to this point.  We now have the
  511. first record with a person's name and a pointer to the second
  512. record, and a second record with a different person's name and
  513. a pointer assigned nil.  We also have three pointers, one
  514. pointing to the first record, one pointing to the last record,
  515. and one we used just to get here since it is only a temporary
  516. pointer.  If you understand what is happening so far, let's
  517. go on to add some additional records to the list.  If you are
  518. confused, go back over this material again.
  519.  
  520.  
  521. TEN MORE RECORDS
  522. ____________________________________________________________
  523.  
  524. The next section of code is contained within a for loop so the
  525. statements are simply repeated ten times.  If you observe
  526. carefully, you will notice that the statements are identical
  527. to the second group of statements in the program (except of
  528. course for the name assigned).  They operate in exactly the
  529. same manner, and we end up with ten more names added to the
  530.  
  531.                                                     Page 12-9
  532.  
  533.                               Pointers and Dynamic Allocation
  534.  
  535. list.  You will now see why the temporary pointer was
  536. necessary, but pointers are cheap, so feel free to use them
  537. at will.  A pointer generally uses only 4 bytes of memory.
  538.  
  539.  
  540. FINALLY, A COMPLETE LINKED LIST
  541. ____________________________________________________________
  542.  
  543. We now have generated a linked list of twelve entries.  We
  544. have a pointer pointing at the first entry, and another
  545. pointer pointing at the last.  The only data stored within the
  546. program itself are three pointers, and one integer, all of the
  547. data is on the heap.  This is one advantage to a linked list,
  548. it uses very little local memory, but it is costly in terms
  549. of programming.  (Keep in mind that all of the data must be
  550. stored somewhere in memory, and in the case of the linked
  551. list, it is stored on the heap.)  You should never use a
  552. linked list simply to save memory, but only because a certain
  553. program lends itself well to it.  Some sorting routines are
  554. extremely fast because of using a linked list, and it could
  555. be advantageous to use in a database.  Figure 12-9 is a
  556. graphical representation of what the linked list looks like.
  557.  
  558.  
  559. HOW DO WE GET TO THE DATA NOW?
  560. ____________________________________________________________
  561.  
  562. Since the data is in a list, how can we get a copy of the
  563. fourth entry for example?  The only way is to start at the
  564. beginning of the list and successively examine pointers until
  565. you reach the desired one.  Suppose you are at the fourth and
  566. then wish to examine the third.  You cannot back up, because
  567. you didn't define the list that way, you can only start at the
  568. beginning and count to the third.  You could have defined the
  569. record with two pointers, one pointing forward, and one
  570. pointing backward.  This would be a doubly-linked list and you
  571. could then go directly from entry four to entry three.
  572.  
  573. Now that the list is defined, we will read the data from the
  574. list and display it on the video monitor.  We begin by
  575. defining the pointer, Place_In_List, as the start of the list. 
  576. Now you see why it was important to keep a copy of where the
  577. list started.  In the same manner as filling the list, we go
  578. from record to record until we find the record with nil as a
  579. pointer.
  580.  
  581. There are entire books on how to use linked lists, and most
  582. Pascal programmers will seldom, if ever, use them.  For this
  583. reason, additional detail is considered unnecessary, but to
  584. be a fully informed Pascal programmer, some insight is
  585. necessary.
  586.  
  587.  
  588.  
  589.  
  590.                                                    Page 12-10
  591.  
  592.                               Pointers and Dynamic Allocation
  593.  
  594. PROGRAMMING EXERCISE
  595. ____________________________________________________________
  596.  
  597. 1.   Write a program to store a few names dynamically, then
  598.      display the stored names on the monitor.  As your first
  599.      exercise in dynamic allocation, keep it very simple.
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.                                                    Page 12-11
  650.